package com.foreveross.fetl.common;

import java.io.Serializable;

import javax.servlet.ServletContext;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.foreveross.fetl.common.domain.IBaseEntity;
import com.foreveross.fetl.util.ClassUtils;

/**
 * 实例工厂
 * @author xiangsf 2013-1-24
 *
 */
public class InstanceFactory {
	
	private static ServletContext servletContext;
	
	
	public static void setServletContext(ServletContext servletContext) {
		InstanceFactory.servletContext = servletContext;
	}
//	/**
//	 * 根据类型，获得实例对象
//	 * <p>通常用于传于实体对象id，从仓储（数据库）中获取该实体实例
//	 * @param <T> 返回的类类型泛型
//	 * @param _clazz 类定义
//	 * @param pkId 可以根据唯一条件获得对象的标识id
//	 * @return 已实例化的T对象
//	 */
//	public static <T extends IBaseEntity> T get(Class<T> _clazz, Serializable pkId){
//		org.foreveross.koala.util.KoalaEntityRepositoryJpa repository = (org.foreveross.koala.util.KoalaEntityRepositoryJpa)InstanceFactory.getInstance("repository_ss");
//		return (T)repository.get(_clazz, pkId);
//	}
	/**
	 * 根据类型，获得实例对象
	 * <p>通常用于传于实体对象id，从仓储（数据库）中获取该实体实例
	 * @param <T> 返回的类类型泛型
	 * @param className 类的字符串描述
	 * @param pkId 可以根据唯一条件获得对象的标识id
	 * @return 已实例化的T对象
	 */
//	public static <T extends IBaseEntity> T get(String className, Serializable pkId){
//		Class<T> _clazz = ClassUtils.loadClass(className);
//		return (T)InstanceFactory.get(_clazz, pkId);
//	}
	/**
	 * 实例化一个新的指定类对象
	 * @param <T> 返回的类类型泛型
	 * @param clazz 类定义
	 * @return 新的实例
	 * @throws Exception
	 */
	public static <T extends IBaseEntity> T getNewInstance(Class<T> clazz) throws Exception{
		return clazz.newInstance();
	}
	/**
	 * 实例化一个新的指定类对象
	 * @param <T> 返回的类类型泛型
	 * @param className 类定义字符串
	 * @return 新的实例
	 * @throws Exception
	 */
	public static <T extends IBaseEntity> T getNewInstance(String className) throws Exception{
		Class<T> _clazz = ClassUtils.loadClass(className);
		return getNewInstance(_clazz);
	}
	/**
	 * 从spring容器中取出指定类型的实例对象
	 * @param <T> 返回的类类型泛型
	 * @param clazz bean的类定义
	 * @return 实例对象T,一般指spring中的bean定义
	 */
	public static <T> T getInstance(Class<T> clazz){
		WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
		return context.getBean(clazz);
	}
	/**
	 * 从spring容器中取出指定类型的实例对象
	 * @param <T> 返回的类类型泛型
	 * @param clazz bean的类定义
	 * @param name bean的名称
	 * @return 实例对象T,一般指spring中的bean定义
	 */
	public static <T> T getInstance(Class<T> clazz, String name){
		WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
		return context.getBean(name, clazz);
	}
	/**
	 * 从spring容器中取出指定类型的实例对象
	 * @param <T> 返回的类类型泛型
	 * @param name bean的名称
	 * @return 实例对象,一般指spring中的bean定义
	 */
	public static Object getInstance(String name){
		WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
		return context.getBean(name);
	}
}
